package presentacion;

import java.awt.BorderLayout;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.RenderedImage;
import java.util.ArrayList;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JScrollPane;
import javax.swing.JSeparator;
import javax.swing.JSpinner;
import javax.swing.JTabbedPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SpinnerNumberModel;

import Jama.Matrix;
import algoritmos.Error;
import algoritmos.numericos.tipos.KMedias;
import algoritmos.numericos.tipos.LVQ;
import algoritmos.numericos.tipos.LVQS;
import algoritmos.numericos.tipos.Parametrico;

import com.sun.media.jai.widget.DisplayJAI;

import entradasalida.EntradaFicheroID3;
import entradasalida.EntradaFicheroImagen;
import entradasalida.EntradaFicheroNumerico;

/**
* This code was edited or generated using CloudGarden's Jigloo
* SWT/Swing GUI Builder, which is free for non-commercial
* use. If Jigloo is being used commercially (ie, by a corporation,
* company or business for any purpose whatever) then you
* should purchase a license for each developer using Jigloo.
* Please visit www.cloudgarden.com for details.
* Use of Jigloo implies acceptance of these licensing terms.
* A COMMERCIAL LICENSE HAS NOT BEEN PURCHASED FOR
* THIS MACHINE, SO JIGLOO OR THIS CODE CANNOT BE USED
* LEGALLY FOR ANY CORPORATE OR COMMERCIAL PURPOSE.
*/
public class GUIPrincipal extends javax.swing.JFrame {
	
	/**
	 * 
	 */
	private static final long serialVersionUID = -5996321747400458748L;

	private EntradaFicheroNumerico fichero1;
	private JSeparator jSeparator1;
	private JButton jButtonGraficoLVQ;
	private JButton jButtonGraficoKMedias;
	private EntradaFicheroImagen fichero2;
	//private EntradaFicheroID3 fichero3;
	
	private KMedias kmedias;
	
	private Parametrico parametrico;
	private LVQ lvq;
	private LVQS lvqs;
	
	private ArrayList<Matrix> entrada;
	
	private ArrayList<Matrix> centros;
	
	private boolean modoGrafico;

	private JMenuItem helpMenuItem;
	private JMenu jMenu5;
	private JScrollPane jScrollPane1;
	private JLabel jLabel1;
	private JButton jButtonCheckNewDataParametrico;
	private JTextField jTextFieldNewDataParametrico;
	private JLabel jLabel2;
	private JTextArea jTextAreaParametrico;
	private JButton jButtonParemetricoAprendizaje;
	private JProgressBar jProgressBarParametrico;
	private JPanel jPanelKMedias;
	private JTabbedPane jTabbedPaneAlgoritmos;
	private JPanel jPanelParametrico;
	private JMenuItem exitMenuItem;
	private JLabel jLabel3;
	private JTextArea jTextAreaKMedias;
	private JScrollPane jScrollPane2;
	private JProgressBar jProgressBarKMedias;
	private JButton jButtonKMediasAprendizaje;
	private JLabel jLabel4;
	private JTextField jTextFieldNewDataKMedias;
	private JButton jButtonCheckNewDataKMedias;
	private JSeparator jSeparator2;
	private JMenuItem openFileMenuItem;
	private JMenuItem newFileMenuItem;
	private JMenuItem graphFileMenuItem;
	private JSpinner jSpinnerNumClasesKMedias;
	private JLabel jLabel5;
	private JPanel jPanelNoSupervisado;
	private JTextArea jTextAreaLVQ;
	private JProgressBar jProgressBarLVQ;
	private JLabel jLabel8;
	private JTextField jTextFieldUmbralLVQ;
	private JButton jButtonLVQAprendizaje;
	private JTextField jTextFieldNewDataLVQ;
	private JButton jButtonCheckNewDataLVQ;
	private JScrollPane jScrollPane3;
	private JLabel jLabel6;
	private JLabel jLabel7;
	private JPanel jPanelSupervisado;
	private JTextArea jTextAreaLVQS;
	private JProgressBar jProgressBarLVQS;
	private JLabel jLabel9;
	private JTextField jTextFieldkMaxLVQS;
	private JButton jButtonLVQSAprendizaje;
	private JTextField jTextFieldNewDataLVQS;
	private JButton jButtonCheckNewDataLVQS;
	private JScrollPane jScrollPane4;
	private JLabel jLabel10;
	private JLabel jLabel11;
	private JMenu jMenu3;
	private JMenuBar jMenuBar1;
	private GUIAcercaDe acercaDe;
	private Image logo;
	
	public GUIPrincipal() {
		super();
		initGUI();
		fichero1 = new EntradaFicheroNumerico();
		fichero2 = new EntradaFicheroImagen();
		//fichero3 = new EntradaFicheroID3();
	}
	
	private void initGUI() {
		try {
			acercaDe = new GUIAcercaDe(this);
			{
				logo = Toolkit.getDefaultToolkit().getImage("./bin/imagenes/ucm.gif");
				this.setIconImage(logo);
				this.setTitle("Algoritmos de Aprendizaje");
			}
			this.setSize(806, 635);
			setDefaultCloseOperation(EXIT_ON_CLOSE);
			this.setResizable(false);
			{
				jTabbedPaneAlgoritmos = new JTabbedPane();
				getContentPane().add(jTabbedPaneAlgoritmos, BorderLayout.CENTER);
				{
					jPanelParametrico = new JPanel();
					jPanelParametrico.setLayout(null);
					jTabbedPaneAlgoritmos.addTab("Paramétrico", null, jPanelParametrico, null);
					jPanelParametrico.setPreferredSize(new java.awt.Dimension(781, 546));
					{
						jScrollPane1 = new JScrollPane();
						jPanelParametrico.add(jScrollPane1);
						jScrollPane1.setBounds(17, 32, 445, 517);
						jScrollPane1.getVerticalScrollBar().setAutoscrolls(true);
						jScrollPane1.getHorizontalScrollBar().setAutoscrolls(true);
						{
							jTextAreaParametrico = new JTextArea();
							jScrollPane1.setViewportView(jTextAreaParametrico);
							jTextAreaParametrico.setText("Algoritmo Paramétrico");
							jTextAreaParametrico.setBounds(18, 33, 442, 514);
							jTextAreaParametrico.setFont(new java.awt.Font("Dialog",2,12));
							jTextAreaParametrico.setEditable(false);
						}
					}
					{
						jProgressBarParametrico = new JProgressBar();
						jPanelParametrico.add(jProgressBarParametrico);
						jProgressBarParametrico.setBounds(544, 157, 137, 14);
					}
					{
						jButtonParemetricoAprendizaje = new JButton();
						jPanelParametrico.add(jButtonParemetricoAprendizaje);
						jButtonParemetricoAprendizaje.setText("Aprendizaje");
						jButtonParemetricoAprendizaje.setBounds(556, 110, 114, 22);
						jButtonParemetricoAprendizaje.addActionListener(new ActionListener() {
							public void actionPerformed(ActionEvent evt) {
									algoritmoParametrico();
							}
						});
					}
					{
						jLabel2 = new JLabel();
						jPanelParametrico.add(jLabel2);
						jLabel2.setText("Nuevo dato");
						jLabel2.setBounds(514, 233, 92, 15);
					}
					{
						jTextFieldNewDataParametrico = new JTextField();
						jPanelParametrico.add(jTextFieldNewDataParametrico);
						jTextFieldNewDataParametrico.setBounds(592, 230, 133, 22);
					}
					{
						jButtonCheckNewDataParametrico = new JButton();
						jPanelParametrico.add(jButtonCheckNewDataParametrico);
						jButtonCheckNewDataParametrico.setText("Comprueba Nuevo Dato");
						jButtonCheckNewDataParametrico.setBounds(514, 283, 211, 22);
						jButtonCheckNewDataParametrico.setEnabled(false);
						jButtonCheckNewDataParametrico.addActionListener(new ActionListener() {
							public void actionPerformed(ActionEvent evt) {
								ArrayList<Number> dato = datoToList(jTextFieldNewDataParametrico.getText());
								if (dato != null && dato.size() == entrada.get(0).getColumnDimension()){
									parametrico.perteneceAClase(dato);
								} else {
									Error.emiteError("Las dimensiones del dato no concuerdan con las muestras.");
								}
							}
						});
					}
					{
						jLabel1 = new JLabel();
						jPanelParametrico.add(jLabel1);
						jLabel1.setText("Terminal");
						jLabel1.setBounds(18, 9, 105, 15);
					}
				}
				{
					jPanelKMedias = new JPanel();
					jTabbedPaneAlgoritmos.addTab("KMedias", null, jPanelKMedias, null);
					jPanelKMedias.setPreferredSize(new java.awt.Dimension(781, 546));
					jPanelKMedias.setLayout(null);
					{
						jButtonCheckNewDataKMedias = new JButton();
						jPanelKMedias.add(jButtonCheckNewDataKMedias);
						jButtonCheckNewDataKMedias.setEnabled(false);
						jButtonCheckNewDataKMedias.setText("Comprueba Nuevo Dato");
						jButtonCheckNewDataKMedias.setBounds(514, 283, 211, 22);
						jButtonCheckNewDataKMedias.addActionListener(new ActionListener() {
							public void actionPerformed(ActionEvent evt) {
								ArrayList<Number> dato = datoToList(jTextFieldNewDataKMedias.getText());
								if (dato != null && dato.size() == entrada.get(0).getColumnDimension()){
									kmedias.perteneceAClase(dato);
								} else {
									Error.emiteError("Las dimensiones del dato no concuerdan con las muestras.");
								}
							}
						});
					}
					{
						jTextFieldNewDataKMedias = new JTextField();
						jPanelKMedias.add(jTextFieldNewDataKMedias);
						jTextFieldNewDataKMedias.setBounds(592, 230, 133, 22);
					}
					{
						jLabel4 = new JLabel();
						jPanelKMedias.add(jLabel4);
						jLabel4.setText("Nuevo dato");
						jLabel4.setBounds(514, 233, 92, 15);
					}
					{
						jButtonKMediasAprendizaje = new JButton();
						jPanelKMedias.add(jButtonKMediasAprendizaje);
						jButtonKMediasAprendizaje.setText("Aprendizaje");
						jButtonKMediasAprendizaje.setBounds(556, 110, 114, 22);
						jButtonKMediasAprendizaje.addActionListener(new ActionListener() {
							public void actionPerformed(ActionEvent evt) {
								algoritmoKMedias();
							}
						});
					}
					{
						jProgressBarKMedias = new JProgressBar();
						jPanelKMedias.add(jProgressBarKMedias);
						jProgressBarKMedias.setBounds(544, 157, 137, 14);
					}
					{
						jScrollPane2 = new JScrollPane();
						jPanelKMedias.add(jScrollPane2);
						jScrollPane2.setBounds(17, 32, 445, 517);
						{
							jTextAreaKMedias = new JTextArea();
							jScrollPane2.setViewportView(jTextAreaKMedias);
							jTextAreaKMedias.setFont(new java.awt.Font("Dialog",2,12));
							jTextAreaKMedias.setText("Algoritmo KMedias");
							jTextAreaKMedias.setEditable(false);
							jTextAreaKMedias.setBounds(18, 33, 442, 514);
						}
					}
					{
						jLabel3 = new JLabel();
						jPanelKMedias.add(jLabel3);
						jLabel3.setText("Terminal");
						jLabel3.setBounds(18, 9, 105, 15);
					}
					{
						jLabel5 = new JLabel();
						jPanelKMedias.add(jLabel5);
						jLabel5.setText("Número de clases:");
						jLabel5.setBounds(513, 62, 127, 15);
					}
					{
						
						jSpinnerNumClasesKMedias = new JSpinner();
						jPanelKMedias.add(jSpinnerNumClasesKMedias);
						jSpinnerNumClasesKMedias.setModel(new SpinnerNumberModel(2,2,Integer.MAX_VALUE,1));
						jSpinnerNumClasesKMedias.setBounds(633, 59, 82, 22);
						jSpinnerNumClasesKMedias.getEditor().setPreferredSize(new java.awt.Dimension(56, -52));
						jSpinnerNumClasesKMedias.getEditor().setName("");
					}
					{
						jButtonGraficoKMedias = new JButton();
						jPanelKMedias.add(jButtonGraficoKMedias);
						jButtonGraficoKMedias.setText("Visualiza gráficos");
						jButtonGraficoKMedias.setBounds(532, 360, 183, 22);
						jButtonGraficoKMedias.setEnabled(false);
						jButtonGraficoKMedias.addActionListener(new ActionListener() {
							public void actionPerformed(ActionEvent evt) {
								dibujaGraficoKMedias();
							}
						});
					}
				}
				{
					jPanelNoSupervisado = new JPanel();
					jTabbedPaneAlgoritmos.addTab("LVQ", null, jPanelNoSupervisado, null);
					jPanelNoSupervisado.setLayout(null);
					jPanelNoSupervisado.setPreferredSize(new java.awt.Dimension(781, 546));
					{
						jScrollPane3 = new JScrollPane();
						jPanelNoSupervisado.add(jScrollPane3);
						jScrollPane3.setBounds(17, 32, 445, 517);
						jScrollPane3.getVerticalScrollBar().setAutoscrolls(true);
						jScrollPane3.getHorizontalScrollBar().setAutoscrolls(true);
						{
							jTextAreaLVQ = new JTextArea();
							jScrollPane3.setViewportView(jTextAreaLVQ);
							jTextAreaLVQ.setText("Algoritmo LVQ no supervisado");
							jTextAreaLVQ.setBounds(18, 33, 442, 514);
							jTextAreaLVQ.setFont(new java.awt.Font("Dialog",2,12));
							jTextAreaLVQ.setEditable(false);
						}
					}
					{
						jProgressBarLVQ = new JProgressBar();
						jPanelNoSupervisado.add(jProgressBarLVQ);
						jProgressBarLVQ.setBounds(544, 157, 137, 14);
					}
					{
						jLabel8 = new JLabel();
						jPanelNoSupervisado.add(jLabel8);
						jLabel8.setText("Umbral");
						jLabel8.setBounds(513, 62, 127, 15);
					}
					{
						jTextFieldUmbralLVQ = new JTextField();
						jPanelNoSupervisado.add(jTextFieldUmbralLVQ);
						jTextFieldUmbralLVQ.setBounds(603, 59, 112, 22);
					}
					{
						jButtonLVQAprendizaje = new JButton();
						jPanelNoSupervisado.add(jButtonLVQAprendizaje);
						jButtonLVQAprendizaje.setText("Aprendizaje");
						jButtonLVQAprendizaje.setBounds(556, 110, 114, 22);
						jButtonLVQAprendizaje.addActionListener(new ActionListener() {
							public void actionPerformed(ActionEvent evt) {
								algoritmoLVQ();
							}
						});
					}
					{
						jLabel6 = new JLabel();
						jPanelNoSupervisado.add(jLabel6);
						jLabel6.setText("Nuevo dato");
						jLabel6.setBounds(514, 233, 92, 15);
					}
					{
						jTextFieldNewDataLVQ = new JTextField();
						jPanelNoSupervisado.add(jTextFieldNewDataLVQ);
						jTextFieldNewDataLVQ.setBounds(592, 230, 133, 22);
					}
					{
						jButtonCheckNewDataLVQ = new JButton();
						jPanelNoSupervisado.add(jButtonCheckNewDataLVQ);
						jButtonCheckNewDataLVQ.setText("Comprueba Nuevo Dato");
						jButtonCheckNewDataLVQ.setBounds(514, 283, 211, 22);
						jButtonCheckNewDataLVQ.setEnabled(false);
						jButtonCheckNewDataLVQ.addActionListener(new ActionListener() {
							public void actionPerformed(ActionEvent evt) {
								ArrayList<Number> dato = datoToList(jTextFieldNewDataLVQ.getText());
								if (dato != null && dato.size() == entrada.get(0).getColumnDimension()){
									lvq.perteneceAClase(dato);
								} else {
									Error.emiteError("Las dimensiones del dato no concuerdan con las muestras.");
								}
							}
						});
					}
					{
						jLabel7 = new JLabel();
						jPanelNoSupervisado.add(jLabel7);
						jLabel7.setText("Terminal");
						jLabel7.setBounds(18, 9, 105, 15);
					}
					{
						jButtonGraficoLVQ = new JButton();
						jPanelNoSupervisado.add(jButtonGraficoLVQ);
						jButtonGraficoLVQ.setText("Visualiza gráficos");
						jButtonGraficoLVQ.setBounds(532, 360, 183, 22);
						jButtonGraficoLVQ.setEnabled(false);
						jButtonGraficoLVQ.addActionListener(new ActionListener() {
							public void actionPerformed(ActionEvent evt) {
								dibujaGraficoLVQ();
							}
						});
					}
				}
				{
					jPanelSupervisado = new JPanel();
					jTabbedPaneAlgoritmos.addTab("LVQ Supervisado", null, jPanelSupervisado, null);
					jPanelSupervisado.setLayout(null);
					jPanelSupervisado.setPreferredSize(new java.awt.Dimension(781, 546));
					{
						jScrollPane4 = new JScrollPane();
						jPanelSupervisado.add(jScrollPane4);
						jScrollPane4.setBounds(17, 32, 445, 517);
						jScrollPane4.getVerticalScrollBar().setAutoscrolls(true);
						jScrollPane4.getHorizontalScrollBar().setAutoscrolls(true);
						{
							jTextAreaLVQS = new JTextArea();
							jScrollPane4.setViewportView(jTextAreaLVQS);
							jTextAreaLVQS.setText("Algoritmo LVQ supervisado");
							jTextAreaLVQS.setBounds(18, 33, 442, 514);
							jTextAreaLVQS.setFont(new java.awt.Font("Dialog",2,12));
							jTextAreaLVQS.setEditable(false);
						}
					}
					{
						jProgressBarLVQS = new JProgressBar();
						jPanelSupervisado.add(jProgressBarLVQS);
						jProgressBarLVQS.setBounds(544, 157, 137, 14);
					}
					{
						jLabel9 = new JLabel();
						jPanelSupervisado.add(jLabel9);
						jLabel9.setText("Límite de iteraciones");
						jLabel9.setBounds(513, 62, 127, 15);
					}
					{
						jTextFieldkMaxLVQS = new JTextField();
						jPanelSupervisado.add(jTextFieldkMaxLVQS);
						jTextFieldkMaxLVQS.setBounds(643, 59, 72, 22);
					}
					{
						jButtonLVQSAprendizaje = new JButton();
						jPanelSupervisado.add(jButtonLVQSAprendizaje);
						jButtonLVQSAprendizaje.setText("Aprendizaje");
						jButtonLVQSAprendizaje.setBounds(556, 110, 114, 22);
						jButtonLVQSAprendizaje.addActionListener(new ActionListener() {
							public void actionPerformed(ActionEvent evt) {
								algoritmoLVQS();
							}
						});
					}
					{
						jLabel10 = new JLabel();
						jPanelSupervisado.add(jLabel10);
						jLabel10.setText("Nuevo dato");
						jLabel10.setBounds(514, 233, 92, 15);
					}
					{
						jTextFieldNewDataLVQS = new JTextField();
						jPanelSupervisado.add(jTextFieldNewDataLVQS);
						jTextFieldNewDataLVQS.setBounds(592, 230, 133, 22);
					}
					{
						jButtonCheckNewDataLVQS = new JButton();
						jPanelSupervisado.add(jButtonCheckNewDataLVQS);
						jButtonCheckNewDataLVQS.setText("Comprueba Nuevo Dato");
						jButtonCheckNewDataLVQS.setBounds(514, 283, 211, 22);
						jButtonCheckNewDataLVQS.setEnabled(false);
						jButtonCheckNewDataLVQS.addActionListener(new ActionListener() {
							public void actionPerformed(ActionEvent evt) {
								ArrayList<Number> dato = datoToList(jTextFieldNewDataLVQS.getText());
								if (dato != null && dato.size() == entrada.get(0).getColumnDimension()){
									lvqs.perteneceAClase(dato);
								} else {
									Error.emiteError("Las dimensiones del dato no concuerdan con las muestras.");
								}
							}
						});
					}
					{
						jLabel11 = new JLabel();
						jPanelSupervisado.add(jLabel11);
						jLabel11.setText("Terminal");
						jLabel11.setBounds(18, 9, 105, 15);
					}
				}
			}
			{
				jMenuBar1 = new JMenuBar();
				setJMenuBar(jMenuBar1);
				{
					jMenu3 = new JMenu();
					jMenuBar1.add(jMenu3);
					jMenu3.setText("Archivo");
					{
						newFileMenuItem = new JMenuItem();
						jMenu3.add(newFileMenuItem);
						newFileMenuItem.setText("Abrir fichero numérico");
						newFileMenuItem.addActionListener(new ActionListener() {
							public void actionPerformed(ActionEvent evt) {
								leeFicheroNumerico();
							}
						});
					}
					{
						graphFileMenuItem = new JMenuItem();
						jMenu3.add(graphFileMenuItem);
						graphFileMenuItem.setText("Abrir fichero gráfico");
						graphFileMenuItem.addActionListener(new ActionListener() {
							public void actionPerformed(ActionEvent evt) {
								leeFicheroGrafico();
							}
						});
					}
					{
						jSeparator1 = new JSeparator();
						jMenu3.add(jSeparator1);
					}
					{
						//openFileMenuItem = new JMenuItem();
						//jMenu3.add(openFileMenuItem);
						//openFileMenuItem.setText("Abrir fichero ID3");
						//openFileMenuItem.addActionListener(new ActionListener() {
						//	public void actionPerformed(ActionEvent evt) {
						//		leeFicheroID3();
						//	}
						//});
					}
					{
						jSeparator2 = new JSeparator();
						jMenu3.add(jSeparator2);
					}
					{
						exitMenuItem = new JMenuItem();
						jMenu3.add(exitMenuItem);
						exitMenuItem.setText("Salir");
						exitMenuItem.addActionListener(new ActionListener() {
							public void actionPerformed(ActionEvent evt) {
								System.exit(0);
							}
						});
					}
				}
				{
					jMenu5 = new JMenu();
					jMenuBar1.add(jMenu5);
					jMenu5.setText("Ayuda");
					{
						helpMenuItem = new JMenuItem();
						jMenu5.add(helpMenuItem);
						helpMenuItem.setText("Acerca de...");
						helpMenuItem.addActionListener(new ActionListener() {
							public void actionPerformed(ActionEvent evt) {
								acercaDe.setVisible(true);
								acercaDe.setModal(true);
							}
						});
					}
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * Carga fichero de datos numérico
	 */
	public void leeFicheroNumerico(){
		if (jProgressBarParametrico.isIndeterminate() || jProgressBarKMedias.isIndeterminate() ||
			jProgressBarLVQ.isIndeterminate()){
			Error.emiteError("Existen aprendizajes en curso.\n        Espere a su finalización");
			return;
		}
		fichero1 = new EntradaFicheroNumerico(this);
		if (fichero1.getFichero() == null){
			return;
		} 
		jTextAreaParametrico.setText("Algoritmo Paramétrico\nFichero " + fichero1.getFichero().getName()+ " leído correctamente.\n");
		jTextAreaKMedias.setText("Algoritmo KMedias\nFichero " + fichero1.getFichero().getName()+ " leído correctamente.\n");
		jTextAreaLVQ.setText("Algoritmo LVQ no supervisado\nFichero " + fichero1.getFichero().getName()+ " leído correctamente.\n");
		jTextAreaLVQS.setText("Algoritmo LVQ supervisado\nFichero " + fichero1.getFichero().getName()+ " leído correctamente.\n");
		jProgressBarParametrico.setValue(0);
		jProgressBarKMedias.setValue(0);
		jProgressBarLVQ.setValue(0);
		jButtonParemetricoAprendizaje.setEnabled(true);
		jButtonKMediasAprendizaje.setEnabled(true);
		jButtonLVQAprendizaje.setEnabled(true);
		jButtonCheckNewDataParametrico.setEnabled(false);
		jButtonCheckNewDataKMedias.setEnabled(false);
		jButtonCheckNewDataLVQ.setEnabled(false);
		// Datos compartidos por los algoritmos
		entrada = new ArrayList<Matrix>();
		int contador = 0;
		// Generamos la lista de matrices de entrada
		entrada = fichero1.getEntrada();
		for (Matrix dato : entrada){
			contador++;
			jTextAreaParametrico.append("x" + contador + " = " + dato + "\n");
			jTextAreaKMedias.append("x" + contador + " = " + dato + "\n");
			jTextAreaLVQ.append("x" + contador + " = " + dato + "\n");
			jTextAreaLVQS.append("x" + contador + " = " + dato + "\n");
		}
		jTextAreaParametrico.append("\n");
		jTextAreaKMedias.append("\n");
		jTextAreaLVQ.append("\n");
		jTextAreaLVQS.append("\n");
		// Generamos la lista de matrices de centros
		centros = fichero1.getCentros();
		// Desactiva el modo gráfico
		modoGrafico = false;
	}
	
	/**
	 * Carga fichero gráfico
	 */
	public void leeFicheroGrafico(){
		if (jProgressBarParametrico.isIndeterminate() || jProgressBarKMedias.isIndeterminate() ||
				jProgressBarLVQ.isIndeterminate()){
				Error.emiteError("Existen aprendizajes en curso.\n        Espere a su finalización");
				return;
		}
		fichero2 = new EntradaFicheroImagen(this);
		if (fichero2.getFichero() == null){
			return;
		} 
		jTextAreaParametrico.setText("Algoritmo Paramétrico\nFichero " + fichero2.getFichero().getName()+ " leído correctamente.\n");
		jTextAreaKMedias.setText("Algoritmo KMedias\nFichero " + fichero2.getFichero().getName()+ " leído correctamente.\n");
		jTextAreaLVQ.setText("Algoritmo LVQ no supervisado\nFichero " + fichero2.getFichero().getName()+ " leído correctamente.\n");
		jProgressBarParametrico.setValue(0);
		jProgressBarKMedias.setValue(0);
		jProgressBarLVQ.setValue(0);
		jButtonParemetricoAprendizaje.setEnabled(true);
		jButtonKMediasAprendizaje.setEnabled(true);
		jButtonLVQAprendizaje.setEnabled(true);
		jButtonCheckNewDataParametrico.setEnabled(false);
		jButtonCheckNewDataKMedias.setEnabled(false);
		jButtonCheckNewDataLVQ.setEnabled(false);
		// Datos compartidos por los algoritmos
		entrada = new ArrayList<Matrix>();
		int contador = 0;
		// Generamos la lista de matrices de entrada
		entrada = fichero2.getEntrada();
		for (Matrix dato : entrada){
			contador++;
			jTextAreaParametrico.append("x" + contador + " = " + dato + "\n");
			jTextAreaKMedias.append("x" + contador + " = " + dato + "\n");
			jTextAreaLVQ.append("x" + contador + " = " + dato + "\n");
		}
		jTextAreaParametrico.append("\n");
		jTextAreaKMedias.append("\n");
		jTextAreaLVQ.append("\n");
		// Activa el modo gráfico
		modoGrafico = true;
	}
	
	/**
	 * Carga fichero de datos de ID3
	 */
	/*public void leeFicheroID3(){
		fichero3 = new EntradaFicheroID3();
		if (fichero3 == null){
			Error.emiteError("Fichero ID3 incorrecto");
		}		
	}*/
	
	private void algoritmoKMedias(){
		if (fichero1.getFichero() == null && fichero2.getFichero() == null){
			Error.emiteError("No se han cargado datos de entrada");
			return;
		}
		if (((Integer)jSpinnerNumClasesKMedias.getValue()) < 2){
			Error.emiteError("El número de clases ha de ser mayor o igual que 2.");
		}
		kmedias = new KMedias(jTextAreaKMedias,jProgressBarKMedias,
							  jButtonCheckNewDataKMedias,jButtonKMediasAprendizaje,
							  jButtonGraficoKMedias);
		kmedias.setEntrada(entrada);
		kmedias.setDimension(entrada.get(0).getColumnDimension());
		kmedias.setNumClases((Integer)jSpinnerNumClasesKMedias.getValue());
		kmedias.start(); // Lanza el hilo de ejecución		
	}
	
	private void algoritmoLVQ(){
		double umbral;
		
		if (fichero1.getFichero() == null && fichero2.getFichero() == null){
			Error.emiteError("No se han cargado datos de entrada");
			return;
		}
		if (jTextFieldUmbralLVQ.getText().compareTo("") == 0) {
			Error.emiteError("Debe especificar un umbral");
			return;			
		}
		try {
			umbral = Float.valueOf(jTextFieldUmbralLVQ.getText()).floatValue();
		} catch(NumberFormatException e) {
			Error.emiteError("El umbral especificado no es correcto");
			return;			
		}
		
		lvq = new LVQ(jTextAreaLVQ, jProgressBarLVQ,jButtonCheckNewDataLVQ,
					  jButtonLVQAprendizaje, jButtonGraficoLVQ);
		lvq.setEntrada(entrada);
		lvq.setDimension(entrada.get(0).getColumnDimension());
		lvq.setUmbral(umbral);
		lvq.start(); // Lanza el hilo de ejecución
	}

	private void algoritmoParametrico(){
		if (modoGrafico){
			Error.emiteError("Este algoritmo sólo permite lectura de ficheros de texto.");
			return;
		}
		if (fichero1.getFichero() == null){
			Error.emiteError("No se han cargado datos de entrada");
			return;
		}
		if (fichero1.getLimites().isEmpty()){
			Error.emiteError("No se poseen datos de límites en la distribución de entrada");
			return;
		}
		parametrico = new Parametrico(jTextAreaParametrico,jProgressBarParametrico,
									  jButtonCheckNewDataParametrico,jButtonParemetricoAprendizaje);
		parametrico.setEntrada(entrada);
		parametrico.setDimension(entrada.get(0).getColumnDimension());
		parametrico.setLimites(fichero1.getLimites());
		parametrico.start(); // Lanza el hilo de ejecución
	}

	private void algoritmoLVQS(){
		int kMax;
		
		if (modoGrafico){
			Error.emiteError("Este algoritmo sólo permite lectura de ficheros de texto.");
			return;
		}
		if (fichero1.getFichero() == null){
			Error.emiteError("No se han cargado datos de entrada");
			return;
		}
		if (fichero1.getLimites().isEmpty()){
			Error.emiteError("No se poseen datos de límites en la distribución de entrada");
			return;
		}
		if (fichero1.getCentros().isEmpty()){
			Error.emiteError("No se poseen datos de los centros de la clases en el fichero de entrada");
			return;
		}
		if (jTextFieldkMaxLVQS.getText().compareTo("") == 0) {
			Error.emiteError("Debe especificar un límite de iteraciones.");
			return;			
		}
		try {
			kMax = Float.valueOf(jTextFieldkMaxLVQS.getText()).intValue();
		} catch(NumberFormatException e) {
			Error.emiteError("El límite de iteraciones especificado no es correcto.");
			return;			
		}
		
		lvqs = new LVQS(jTextAreaLVQS, jProgressBarLVQS,jButtonCheckNewDataLVQS,
					  jButtonLVQSAprendizaje);
		lvqs.setEntrada(entrada);
		lvqs.setCentros(centros);
		lvqs.setDimension(entrada.get(0).getColumnDimension());
		lvqs.setkMax(kMax);  
		lvqs.start(); // Lanza el hilo de ejecución
	}
	
	/**
	 * Transforma la cadena a una lista de números
	 * @param arg0 Cadena de entrada
	 * @return Lista dinámica de números enteros
	 */
	private ArrayList<Number> datoToList(String arg0){
		ArrayList<Number> lista = new ArrayList<Number>();
		boolean dato = false;
		int numero = 0;
		for (int i = 0; i < arg0.length(); i++){
			char caracter = arg0.charAt(i);
			if (caracter == ','){
				if (dato){
					lista.add(numero);
					dato = false;
					numero = 0;
				}
			}else if (caracter < '0' || caracter > '9'){
				Error.emiteError("El dato ha de ser numérico sin espacios. Ej: 2,15,4");
				return null;
			}else { // Si es un número se acepta
				numero *= 10;
				numero += caracter - '0';
				dato = true;
			}
		}
		if (dato){
			lista.add(numero);
		}
		return lista;
	}
	
	/**
	 * Muestra los dos ficheros gráficos generados por el algoritmo KMedias
	 */
	private void dibujaGraficoKMedias(){
		if (!modoGrafico){
			Error.emiteError("El fichero cargado no es un gráfico");
			return;
		}
		showImage("Fichero Original KMedias", fichero2.getImagen().getPInput());
		showImage("Fichero Transformado KMedias", fichero2.getImagen().getFicheroSalida(kmedias.getCentros(), kmedias.getConjuntos()));
	}

	/**
	 * Muestra los dos ficheros gráficos generados por el algoritmo LVQ
	 */
	private void dibujaGraficoLVQ(){
		if (!modoGrafico){
			Error.emiteError("El fichero cargado no es un gráfico");
			return;
		}
		showImage("Fichero Original LVQ", fichero2.getImagen().getPInput());
		showImage("Fichero Transformado LVQ", fichero2.getImagen().getFicheroSalida(lvq.getCentros(), lvq.getConjuntos()));
	}

	/**
	 * Muestra las dos imágenes
	 * @param title Título de la ventana
	 * @param image Imagen gráfica a mostrar
	 */
	private void showImage(String title,RenderedImage image){
	    JFrame f = new JFrame(title);
	    f.getContentPane().add(new DisplayJAI(image));
	    f.pack();
	    f.setResizable(false);
	    f.setVisible(true);
	    f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    }

}
